import {useEffect, useState} from "react";

export  const  isFalsy=(value:unknown) => (value === 0 ? false : !value);

//在一个函数离，改变传入的对象本身是不好的
export  const  cleanObject=(object:object)=>{
    //Object.assign({},object)
    const result={...object};
    Object.keys(result).forEach((key:string)=>{
           //@ts-ignore
           const value=result[key];
           if(!isFalsy(value)){
               //@ts-ignore
               delete  result[key];
           }
    })
    return result;
}


//自定义hook
export  const  useMount=(callback:()=>void)=>{
    //react useEffect  [],监听空，也就是初始化加载
    useEffect(()=>{
        callback()
    },[])
}

//
// //自定义hook
// export  const  debounce=(func,delay)=>{
//     let timeout;
//     return  (...param)=>{
//         if(timeout){
//             clearTimeout(timeout);
//         }
//         timeout=setTimeout(function (){
//             func(param);
//         },delay);
//     };
// }

//<>泛型
export  const  useDebounce=<V>(value:V,delay?:number)=>{
    const [debounceValue,setDebouncedValue]=useState(value);
    //当value、delay变化的时候
    useEffect(()=>{
        //每次在value变化以后，设置一个定时器
        const  timeout=setTimeout(()=>setDebouncedValue(value),delay)
        //每次在上一个useEffect处理完以后再运行（第一次设置的timeout，被第二个清理）
        return ()=>clearTimeout(timeout);
    },[value,delay])
    return debounceValue;
}
